﻿#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"
#include "cocostudio/CocoStudio.h"
#include "ui/CocosGUI.h"

#include "MyPublicMacro.h"

using namespace cocos2d;
USING_NS_CC;

#define  THREAD_MAX_LOOP  1000			// 线程内循环次数，用于测试
#define  THREAD_SLEEP_IN_LOOP  50			// 线程内在每次循环中的睡眠时间，ms，用于测试

class HelloWorld : public cocos2d::Layer
{
public:
    // there's no 'id' in cpp, so we recommend returning the class instance pointer
    static cocos2d::Scene* createScene();

	~HelloWorld();

    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
    virtual bool init();

    // implement the "static create()" method manually
    CREATE_FUNC(HelloWorld);

	//virtual void onExit();

	// 进入场景后，要初始化内容
	virtual void onEnterTransitionDidFinish();

	// 离开场景前，要释放内容
	virtual void onExitTransitionDidStart();

	void onTimer01(float dt);

	// 事件桥梁定时器的回调函数
	void onEventBridge(float dt);

	// 发送自定义消息
	void sendCustomEvent();

	void onBt1(Ref * pSender, ui::Widget::TouchEventType type);

	// // 向数据仓库写入数据
	void onBt2(Ref * pSender, ui::Widget::TouchEventType type);

	// 从数据仓库中读取数据
	void onBt3(Ref * pSender, ui::Widget::TouchEventType type);

	// 向服务端发送一条消息
	void onBt4(Ref * pSender, ui::Widget::TouchEventType type);

	// 向服务端发送一批信息
	void onBt5(Ref * pSender, ui::Widget::TouchEventType type);

	// 用线程压力测试数据仓库
	void onBt6(Ref * pSender, ui::Widget::TouchEventType type);

	/*
	本文件的格式是 UTF8，在 windos 和 android 下针对 G2U、U2G 的处理，此函数勿删
	结论：
	1、GB2312用2个字节表示一个中文字符，而UTF8用3个字节表示一个中文字符。
	2、Android 与 IOS 是同一种标准。
	3、组件输入框的手工输入内容在任何平台下都是 UTF8 字串。
	4、组件在任何平台下只能显示 UTF8 字串，而 GB2312字串会是乱码。
	*/
	void onBt7(Ref * pSender, ui::Widget::TouchEventType type);

	// 林跃南的资源方式：EXCEL--》CSV--》*.h和*.cpp 
	void onBt8(Ref * pSender, ui::Widget::TouchEventType type);

	void onBt9(Ref * pSender, ui::Widget::TouchEventType type);

	void threadWriteToRepository();

	// 线程，向数据仓库写入数据，用于压力测试
	void threadReadFromRepository();

public:

	// 注册同步事件监听器
	void addCustomEventListener();

	// 连接结果
	int connectResult(int iClientId, int iSubCode, int iReconnectCount);

	// 断线重连
	int reConnectResult(int iClientId, int iSubCode, int iReconnectCount);

	void onMyEventCustom01(EventCustom* event);
	void onMyEventCustom02(EventCustom* event);

public:
	Node*  m_pRootNode=nullptr; 

	std::thread		_writeToRepositoryThread;
	std::thread		_readFromRepositoryThread;
};

#endif // __HELLOWORLD_SCENE_H__
